package com.speily.spring.aop;

import com.speily.spring.aop.service.ITarget;
import com.speily.spring.aop.service.impl.ProxyTarget;
import com.speily.spring.aop.service.impl.Target;

/**
 * @Auther: SPL
 * @Date: 2019-05-30 14:26
 * @Description:
 */
public class Test {

    public static void main(String[] args) {

        //构造方法传入被代理对象，代理对象重写接口方法，方法中调用目标的实现，并且可以增强目标方法，
        ITarget target = new ProxyTarget(new Target());//如果我们需要日志功能，则使用代理类
        //ITarget target = new Target();//如果我们不需要日志功能则使用目标类
        target.test();

        /*
        1、代理测试（动态，静态，aop基本原理类似--利用反射实现操作目标代理对象）
        当需要代理的对象很多时，上面的方式会出现很多重复逻辑代码，效率低
        jdk跟我们提供了一个API java.lang.reflect.InvocationHandler的类， 这个类可以让我们在JVM调用某个类的方法时动态的为些方法做些什么事
        动态代理实现主要是实现InvocationHandler，并且将目标对象注入到代理对象中，利用反射机制来执行目标对象的方法。
        */

        DynaProxyTest dynaProxyTest = new DynaProxyTest();
        ITarget target1 = (ITarget) dynaProxyTest.bulidTarget(new Target());//动态构造被代理对象
        target1.test();

    }

}
